home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 3 / Info_Mac_1994-01.iso / Development / Information / FBasicTN Vol1 next >
Text File  |  1993-06-25  |  14KB  |  356 lines

  1. FutureBASIC Technical Notes Help (Part 1)
  2. ____________________________________________
  3. Introduction
  4. ____________________________________________
  5.  
  6. This help file contains technical notes that provides solutions to some problems encountered when programming in FutureBASIC.
  7.  
  8. As new notes are added the updates will be made available via online services like America Online and AppleLink.
  9.  
  10. These notes should be considered Freeware and can be diseminated by FutureBASIC owners as widely as possible to ensure that all FutureBASIC owners are informed of their contents. Non-FutureBASIC owners are restricted from such distribution.
  11.  
  12. For more information you can contact:
  13.  
  14.        Zedcor Technical Support:
  15.        602.795.3996  Mon-Fri, 9AM-5PM MST
  16.  
  17.  
  18. ==================================================
  19.  
  20. Technical Note #1
  21. ____________________________________________
  22. POS(0) vs. PRINT%
  23. WRITTEN: 4 NOV 92 (LFT)
  24. LAST UPDATE: 4 NOV 92
  25. ____________________________________________
  26.  
  27. The POS(0) function fails to return the correct column position when used with PRINT%.  Instead, it adds each subsequent column position to the previous one resulting in incorrect column values.
  28.  
  29. The POS function returns a character position within the current output line. It is thus a holdover from character based displays of old (remember 24x80 displays?).
  30.  
  31. Since the Macintosh uses a graphical display based on pixels, it is more natural to use a pixel based placement instead of columns. PRINT% was created to position text to within a resolution of 1 pixel and doesn't clear the buffer used by POS.
  32.  
  33. Use the WINDOW(_penH) and WINDOW(_penV) functions to get the current pixel position of the text pen instead of POS.
  34.  
  35. POS(0) does work correctly with the PRINT@ position which is character oriented.
  36.  
  37. (Thanks to Rich Love for finding this.)
  38.  
  39.  
  40.  
  41. ==================================================
  42.  
  43. Technical Note #2
  44. ____________________________________________
  45. CALL values
  46. WRITTEN: 4 NOV 92 (LFT)
  47. LAST UPDATE: 4 NOV 92
  48. ____________________________________________
  49.  
  50. When using the CALL statement to access external code resources, it is important to remember that CALL expects variables with type declarations to push them correctly on the stack.  For example, the following pushes two integer variables, a long integer, and a string address onto the stack:
  51.  
  52. CALL _"fooh",999, ( var1%, var2%, var3&, var4$)
  53.  
  54. If, however, you pass an expression as a literal value, the CALL statement assumes that the expression represents a LONG INTEGER and places a long word on the stack, no matter what the actual expression value or size. For example:
  55.  
  56. CALL _"fooh", 999, ( 5, var2%, var3&, var4$)
  57.  
  58. pushes a long integer, an integer, a long integer, and a string address on the stack.
  59.  
  60. You can override this by placing an integer type declaration (%) BEFORE the actual value. This tells CALL the actual size of the expression to place onto the stack. To correct the above problem, you would thus use:
  61.  
  62. CALL _"fooh", 999, ( %5, var2%, var3&, var4$)
  63.  
  64.  
  65.  
  66. ==================================================
  67.  
  68. Technical Note #3
  69. ____________________________________________
  70. FILES$ & Boomerang
  71. WRITTEN: 10 NOV 92 (LFT)
  72. LAST UPDATE: 10 NOV 92
  73. ____________________________________________
  74.  
  75. A program that doesn't use events may encounter problems using the FILES$ function on a Macintosh where Super Boomerang is running.
  76.  
  77. The problem surfaces when an event is pending in the event queue and a call to FILES$ is made without any fileType specified. When the get dialog appears, Super Boomerang takes charge and selects the last file chosen in that directory, clicks the Open button, and returns the file name and volRefNum% for that file. The file may or may not be the one you wanted to open.
  78.  
  79. The solution is to read the event with DIALOG ON and DIALOG OFF prior to using FILE$ to get a filename. This prevents Super Boomerang from taking over and opening any file it wants. For example:
  80.  
  81. DIALOG ON
  82. DIALOG OFF
  83. fileName$ = FILES$ (_fOpen, "", , v
  84. olRefNum%)
  85. LONG IF filename$ <> ""
  86.   ' and so onx
  87. END IF
  88.  
  89. will solve the problem even if you are not using events in other portions of your program.
  90.  
  91. Programs that handle events do not experience this problem.
  92.  
  93. (Thanks to Tony Andreoli for finding and debugging this)
  94.  
  95.  
  96.  
  97. ==================================================
  98.  
  99. Technical Note #4
  100. ____________________________________________
  101. INCLUDE File Notes
  102. WRITTEN: 10 NOV 92 (LFT)
  103. LAST UPDATE: 10 NOV 92
  104. ____________________________________________
  105.  
  106. When using INCLUDE files, it is important to remember the difference between _aplIncl (application only ), _resIncl (code resources ony), and _allIncl (both application & code resources) files.
  107.  
  108. When you use:
  109.  
  110. INCLUDE FILE _aplIncl
  111.  
  112. in an INCLUDE file, this tells the compiler that all FutureBASIC and Toolbox calls and functions should be supported in the INCLUDE.
  113.  
  114. However, when you use:
  115.  
  116. INCLUDE FILE _resIncl
  117.  
  118. the compiler uses the Mini-Runtime package which allows only a subset of FutureBASIC commands (those marked with an (M) in the Reference manual) and all Toolbox calls and functions.
  119.  
  120. Also, when using:
  121.  
  122. INCLUDE FILE _allIncl
  123.  
  124. note that this version compiles both types of resources into the INCLUDE file. This means that the pass compiling the _aplIncl may be successful while the pass creating the _resIncl could fail with an error.
  125.  
  126. Failure to take these differences into account can cause an error ("application only statement or function used in non-application program"). The solution is to replace the _resIncl or _allIncl with _aplIncl for application INLCUDES or strip out the offending application-only statements for a code resource INCLUDE.
  127.  
  128. Note that FutureBASIC's BCD floating point routines may not be used when compiling applications that use the mini-runtime.
  129.  
  130.  
  131.  
  132. ==================================================
  133.  
  134. Technical Note #5
  135. ____________________________________________
  136. Using QB MBPC's in FB
  137. WRITTEN: 11 NOV 92 (LFT)
  138. LAST UPDATE: 11 NOV 92
  139. ____________________________________________
  140.  
  141. It is possible to use MBPC code resources writ
  142. ten in other languages for QuickBASICx to be used in FutureBASIC.
  143.  
  144. The key to using MBPCs or MBLC is to rebuild the code resource in the original environment without adding the BASICLib.asm file. This removes the header and callback routines to QB that are not supported in FutureBASIC.
  145.  
  146. (Thanks to Rich Love for pointing this out)
  147.  
  148.  
  149.  
  150. ==================================================
  151.  
  152. Technical Note #6
  153. ____________________________________________
  154. MOUSE Speed Mischief
  155. WRITTEN: 19 NOV 92 (LFT)
  156. LAST UPDATE: 19 NOV 92
  157. ____________________________________________
  158.  
  159. It seems that many people are looking for and never see the MOUSE(0) function return a 1 (_click1) value indicating a single mouse click. In most cases the value returned is -1 (_click1nDrag).
  160.  
  161. The discrepency occurs between the time the mouse is initially clicked and the time its reported by the MOUSE(0) function. MOUSE(0) will always return the state of the  button at the time of inquiry and if the button is still down the message will be _click1nDrag, not _click1.
  162.  
  163. This is most noticeable on new, faster machines with higher clock rates. It is almost impossible in some cases to ever see a _click1 since the application vectors so fast  that the MOUSE(0) statement see's a finger holding the mouse button down and reports _click1nDrag.
  164.  
  165. The solution is to use the ABS function to return a value of _click1 no matter whether MOUSE(0) returns _click1 or _click1nDrag.
  166.  
  167.  
  168.  
  169.  
  170. ==================================================
  171.  
  172. Technical Note #7
  173. ____________________________________________
  174. MacinTalk Rides Again
  175. WRITTEN: 1 DEC 92 (LFT)
  176. LAST UPDATE: 27 APR 93
  177. __________________________
  178. __________________
  179.  
  180. (String removed in FB v1.02)
  181.  
  182. While MacinTalkx has never really been supported by Apple, using it in ZBASIC was made easy through the use of the OPEN TALK and TALK statements. While its not mentioned in the manuals (see the FutureBASIC Help file) these statements are still available and usable in FutureBASIC even under System 7.
  183.  
  184. To make MacinTalk accessible its necessary to modify a STR# resource in the Futurex Extras file. Use the following steps to make the change:
  185.  
  186. 1.  Run ResEdit (FutureBASIC should not be running)
  187. 2.  Open the Futurex Extras file
  188. 3.  Open the STR# resource picker window
  189. 4.  Open STR# 194
  190. 5.  Locate: item # 14 "No MacinTalk Reader"
  191. 6.  Replace: item #14 with ""  (clear text in item only, don't delete) 
  192. 7.  Choose Save from the File menu
  193. 8.  Close all windows and quit ResEdit.
  194.  
  195. Why the change works:
  196. The MacinTalk driver has two speech options, one allows you to use English phrases for a speech string, the other enables you to use phonemes. The text in the STR# makes MacinTalk look for a phoneme file which isn't found. This results in a "File Not Found" error.
  197.  
  198. Using MacinTalk:
  199. You can include the following function in your programs to make using MacinTalk even easier. Pass it a string and any changes to the speech settings and it does the work of opening the driver, speaking the string, and closing the driver.
  200.  
  201. Modify to suit your own tastes. Ideally you can probably set the parameters to default values and just pass a string for it to speak.
  202.  
  203. ' speech$...text to say
  204. ' speed%... rate of speech (85 - 425 words/minute,
  205.             default = 150 wpm)
  206. ' pitch%....voice pitch (65 - 500 Hz, 110 default) ' talk%.....voice style: 0=natural, 1 = robotic
  207. ' sex%......male or female voice (never implemented by
  208.             Apple)
  209.  
  210. LOCAL FN DoTalk (speech$,speed%,pitch%,talk%,sex%)   OPEN TALK, #-4, "", 512
  211.   TALK #-4, speed%, pitch%, talk%, sex%
  212.   PRINT #-4, speech$
  213.   CLOSE #-4
  214. END FN
  215.  
  216. txt$ = "FutureBASIC can talk!)
  217. FN DoTalk (txt$, 150,  110,  0,  0)
  218.  
  219.  
  220. Warning:
  221. It is recommended that you use the above routine to open and then close MacinTalk after each use since the Sound Manager on newer machines is disconnected when MacinTalk is operating. This can prevent system beeps and other sound resources from being played.
  222.  
  223. Also, there is no guarantee that MacinTalk will work on all machines.
  224.  
  225. (Thanks to a host of people who wanted to see MacinTalk again.)
  226.  
  227.  
  228.  
  229. ==================================================
  230.  
  231. Technical Note #8
  232. ____________________________________________
  233. Array Disarray Bug
  234. WRITTEN: 2 DEC 92 (LFT)
  235. LAST UPDATE: 21 APR 93
  236. ____________________________________________
  237.  
  238. (Bug corrected in FB v1.02)
  239.  
  240. The first example demonstrates a bug in release 1.01 of FutureBASIC. Two ingredients are essential to manifest this bug:
  241.  
  242. 1)  The first array declared within a given scope (either local or global)
  243.       must be exactly 8 bytes long.
  244. 2)  References to any following array must involve a variable subscript.
  245.  
  246. When both these conditions exist, references to the second array will INCORRECTLY refer to the elements of the first array.
  247.  
  248. DIM myrect%(3)       'first array has size 8 bytes DIM duh%(100)
  249.  
  250. Zero% = 0
  251. duh% (Zero%) = 9     'arrays subscripted with a var PRINT duh% (Zero%)
  252.  
  253. myrect% (Zero%) = 3  'refs to 1st array are same
  254. PRINT duh% (Zero%)   'as refs to 2nd...OUCH!
  255. INPUT Junk$
  256.  
  257. This problem can be bypassed by reversing the order of the DIM statements like this:
  258.  
  259. DIM duh%(100)
  260. DIM myrect%(3)       '2nd array has size 8 bytes
  261.  
  262. Zero% = 0
  263. duh% (Zero%) = 9     'arrays subscripted with a var PRINT duh% (Zero%)
  264.  
  265. myrect% (Zero%) = 3  'refs to correct array
  266. PRINT duh% (Zero%)
  267. INPUT Junk$
  268.  
  269.  
  270. Fixing this Bug:
  271. You can use ResEdit to correct this bug by modifying a word in a single CODE resource of FutureBASIC.  The steps include:
  272.  
  273. 1.  Run ResEdit.
  274. 2.  Open FutureBASIC.
  275. 3.  Open the CODE resource picker (shows all CODE resources) 4.  Open CODE #9.
  276. 5.  Find offset &H3998
  277. 6.  Replace &H660C3620 with &H660C603C
  278. 7.  Save your changes.
  279. 8.  Close FutureBASIC and quit ResEdit.
  280.  
  281.  
  282. (Thanks to Steve Ross for finding this nasty.)
  283.  
  284.  
  285. ==================================================
  286.  
  287. Technical Note #9
  288. ____________________________________________
  289. READ/WRITE Records Bug
  290. WRITTEN: 7 DEC 92 (LFT)
  291. LAST UPDATE: 21 APR 93
  292. ____________________________________________
  293.  
  294. (Bug corrected in FB v1.02)
  295.  
  296. There is a problem in the reading and writing of record type variables using READ and WRITE. This bug causes the writing of record zero to actually write an incorrect length of data (many times larger) than the actual record size. The example below demonstrates the problem:
  297.  
  298. DIM RECORD test              'define a record
  299.   DIM rect.8
  300.   DIM 25 tmp$
  301. DIM END RECORD .test
  302.  
  303. DIM testRec.test             'define record variable
  304.  
  305. CALL SETRECT (testRec.top%, 10, 10, 20, 20)
  306. testRec.tmp$  = "Record #1"
  307.  
  308. OPEN "R", 1, "Test RW", _test, SYSTEM (_aplVol)
  309. RECORD #1, 0                 'set record number
  310. WRITE #1, testRec            'write data to disk
  311.  
  312. CALL SETRECT (testRec.top%, 50, 50, 70, 70)
  313. testRec.tmp$  = "Record #2"
  314. RECORD #1, 1                 'set record number
  315. WRITE #1, testRec            'write data to disk
  316. CLOSE #1
  317.  
  318. OPEN "R", 1, "Test RW", _test, SYSTEM (_aplVol)
  319. RECORD #1, 0
  320.               'set record number
  321. READ #1, testRec             'read data from disk
  322.  
  323. PRINT "---
  324.  RECORD #1 ---"    'show record data
  325. PRINT testRec.top%,testRec.left%
  326. PRINT testRec.bottom%,testRec.right%
  327. PRINT tmp$
  328.  
  329. RECORD #1, 1                 'set record number
  330. READ #1, testRec
  331. 'read data from disk
  332. CLOSE #1
  333.  
  334. PRINT "--- RECORD #1 ---"    'show record data
  335. PRINT testRec.top%,testRec.left%
  336. PRINT testRec.bottom%,testRec.right%
  337. PRINT tmp$
  338. STOP
  339.  
  340. Fixing this Bug:
  341. You can use ResEdit to correct this bug by modifying a word in a single CODE resource of FutureBASIC.  The steps include:
  342.  
  343. 1.  Run ResEdit.
  344. 2.  Open FutureBASIC.
  345. 3.  Open the CODE resource picker (shows all CODE resources) 4.  Open CODE #9.
  346. 5.  Find offset &H28B6
  347. 6.  Replace &HEE8C3650 with &HEE8C3642
  348. 7.  Save your changes.
  349. 8.  Close FutureBASIC and quit ResEdit.
  350.  
  351.  
  352. (Thanks to Miro Valach for finding this nasty one.)
  353.  
  354. to be cont...
  355.  
  356.